﻿using System;

namespace _73_将抽象类作为类型约束_泛型
{
    class Program
    {
        static void Main(string[] args)
        {
            ITest<Animal> aa = new TestAn1<Animal>();

            aa.Doworkit(new Fox());
            aa.Doworkit(new Quail());
            aa.Doworkit(new Chicken());

            Console.Read();

            Console.WriteLine("Hello World!");
        }

        /// <summary>
        /// 公共基类
        /// </summary>
        public abstract class Animal
        {
            public abstract void CheckIn();
        }
        //声明四个新类，都实现Animal抽象类
        public class Meerkat : Animal
        {
            public override void CheckIn()
            {
                Console.WriteLine("这是鸡。\n");

            }
        }

        public class Fox : Animal
        {
            public override void CheckIn()
            {
                Console.WriteLine("这是狐狸。\n");
            }
        }

        public class Chicken : Animal
        {
            public override void CheckIn()
            {
                Console.WriteLine("这是鸡。\n");
            }
        }

        public class Quail : Animal
        {
            public override void CheckIn()
            {
                Console.WriteLine("这是鹦鹉。\n");
            }
        }


        //声明一个泛型接口，将类型参数作为注入参数，这样就可以在后续使用中支持传递不同的派生程序的类
        public interface ITest<in T>
        {
            void Doworkit(T pr);
        }

        //声明泛型类，并实现上面的泛型接口，将类型参数约束必须是从Animal派生的类
        public class TestAn1<T> : ITest<T>
            where T : Animal
        {
            public void Doworkit(T pr)
            {
                //CheckIn方法是在抽象类中定义的
                //所有实现该抽象类的类型都能访问
                pr.CheckIn();
            }
        }
    }
    }
